// luch-request请求插件，类似axios
import Request from '@/utils/luch-request/index.js'
import baseUrl from '@/utils/baseUrl.js' // api接口地址

import store from '@/store/index.js'

const http = new Request()

// 跳转到登录页面
const toLogin = (msg) => {
  // 登录信息-清除vuex
  store.commit('resetInfo')
  store.commit('user/resetInfo')
  //token存储-清除缓存
  uni.removeStorageSync('token')
  uni.removeStorageSync('userInfoDetail')
  uni.removeStorage({
    key: 'Ztc_B_USER_INFO',
    success: function (res) {
      uni.redirectTo({
        url: '/pages_login/login/login',
      })
    },
  })
  // 跳转逻辑
  uni.reLaunch({
    url: '/pages_login/login/login',
  })
}

// 消息提示框弹窗
const msgAlert = (msg, success = () => {}) => {
  uni.showToast({
    title: msg || '网络异常，请稍后重试',
    icon: 'none',
    duration: 2000,
    success: success,
  })
}

// 设置默认配置
http.setConfig((config) => {
  config.baseURL = baseUrl // 接口地址
  config.timeout = 6000 // 超时
  return config
})

http.interceptors.request.use((config) => {
  config.header = {
    ...config.header,
    'content-type': 'application/json; charset=utf-8',
    Auth: uni.getStorageSync('token'),
  }
  return config
})

// 响应拦截器
http.interceptors.response.use(
  // 成功响应
  (res) => {
    if (res.statusCode === 200 && res.data.code === 200) {
      return res.data
    } else {
      switch (res.data.code) {
        case -1:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case -2:
          msgAlert(res.data.msg)
          break
        case -3:
          msgAlert(res.data.msg)
          break
        case -4:
          if (res.config.url.indexOf('GetTxtByImageBase64') < 1) {
            msgAlert(res.data.msg)
          }
          break
        case -5:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case -6:
          let msg = res.data.msg + ', 请稍后'
          msgAlert(res.data.msg)
          break
        case -7:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case 500:
          msgAlert('系统异常，请稍后重试或联系客服')
          break
        case 501:
          msgAlert('系统异常，请稍后重试或联系客服')
          break
        case 502:
          msgAlert('服务器更新')
          break
        case 503:
          msgAlert(res.data.msg)
          break
        case 249:
          msgAlert(res.data.msg)
          break
        default:
          msgAlert(res.data.msg)
      }
      return Promise.reject(res.data)
    }
  },

  // 错误响应
  (res) => {
    console.error(res)
    // 处理请求超时
    if (RegExp(/timeout/).test(res.errMsg)) {
      console.error('请求超时')
      msgAlert('请求超时')
      return Promise.reject(res.data.msg)
    }
    if (res.statusCode === 500) {
      switch (res.data.code) {
        case -1:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case -2:
          msgAlert(res.data.msg)
          break
        case -3:
          msgAlert(res.data.msg)
          break
        case -4:
          msgAlert(res.data.msg)
          break
        case -5:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case -6:
          let msg = res.data.msg + ', 请稍后'
          msgAlert(res.data.msg)
          break
        case 500:
          msgAlert(res.data.msg)
          break
        case 502:
          msgAlert('服务器更新')
          break
        case 503:
          msgAlert(res.data.msg)
          break
        default:
          msgAlert(res.data.msg)
      }
    } else {
      switch (res.statusCode) {
        case 401:
          msgAlert(res.data.msg, () => {
            toLogin(res.data.msg)
          })
          break
        case 403:
          msgAlert(res.data.msg)
          break
        case 404:
          msgAlert(res.data.msg)
          break
        case 249:
          msgAlert(res.data.msg)
          break
        case 502:
          msgAlert('服务器更新')
          break
        default:
          msgAlert(res.data.msg)
      }
    }
    return Promise.reject(res.data.msg)
  }
)

export default http
